package com.wus.common.mybatis.core.util;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wus.common.core.domain.page.PageResultDTO;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 分页工具类
 *
 * @author wus
 */
public class PageUtil {

    /**
     * 将分页信息封装到统一的接口（已弃用，采用下方的统一接口）
     *
     * @param pageInfo
     * @return
     */
    @Deprecated
    public static PageResultDTO notTransformEntityAndReturn(Page<?> pageInfo) {
        PageResultDTO pageResult = new PageResultDTO();
        pageResult.setPageNum((int) pageInfo.getCurrent());
        pageResult.setPageSize((int) pageInfo.getSize());
        pageResult.setTotalSize(pageInfo.getTotal());
        pageResult.setTotalPages((int) pageInfo.getPages());
        return pageResult;
    }

    /**
     * 将集合中的元素转换为另一种类型，并收集到一个新的列表中。
     *
     * @param <T> 原始集合元素的类型
     * @param <R> 转换后元素的类型
     * @param pageInfo 原始分页数据
     * @param transformer 转换函数，为null时，不做实体转换
     * @return 转换后的数据
     */
    public static <T, R> PageResultDTO transformEntityAndReturn(Page<T> pageInfo, Function<T, R> transformer) {
        if (pageInfo == null) {
            throw new IllegalArgumentException("Page cannot be null");
        }
        if (pageInfo.getRecords() == null) {
            throw new IllegalArgumentException("Collection cannot be null");
        }
        PageResultDTO pageResult = new PageResultDTO();
        pageResult.setPageNum((int) pageInfo.getCurrent());
        pageResult.setPageSize((int) pageInfo.getSize());
        pageResult.setTotalSize(pageInfo.getTotal());
        pageResult.setTotalPages((int) pageInfo.getPages());
        if (transformer == null) {
            // throw new IllegalArgumentException("Transformer function cannot be null");
            // 不做实体转换
            pageResult.setContent(pageInfo.getRecords());
        } else {
            List<R> list = pageInfo.getRecords().stream()
                    .map(transformer)
                    .collect(Collectors.toList());
            pageResult.setContent(list);
        }
        return pageResult;
    }
}